package com.fingard.dsp.bank.directbank.xib01;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fingard.constant.Format;
import com.fingard.dsp.bank.dbobj.receipt.ReceiptData;
import com.fingard.dsp.bank.dbobj.receipt.ReceiptDataHelper;
import com.fingard.dsp.bank.directConfig.ReceiptProConfig;
import com.fingard.dsp.bank.directbank.bankInterface.IReceiptPro;
import com.fingard.dsp.bank.reqrespobj.downloadreceipt.ReqQryReceipt;
import com.fingard.dsp.bank.reqrespobj.downloadreceipt.RetAtsReceipt;
import com.fingard.text.StringHelper;

import java.io.File;
import java.util.Date;

/**
 * 厦门国际银行电子回单接口
 * @author alan
 * @version v1.5
 * @date 2020-04-28
 */
public class XIB01ReceiptPro extends XIB01Base implements IReceiptPro {

    /**
     * 电子回单查询--按天查询
     * @param pConfig 配置类
     * @param pReqReceipt 电子回单请求类
     * @param pOneDay 查询时间
     * @return
     * @throws Exception
     */
    @Override
    public RetAtsReceipt qryReceiptOneDay(ReceiptProConfig pConfig, ReqQryReceipt pReqReceipt, Date pOneDay) throws Exception {
        //查询日期
        String queryDate=Format.Date8Format.format(pOneDay);
        //电子回单下载地址
        String receiptDownloadPath=StringHelper.trimEndFileSp(pConfig.localSaveMainDir)+File.separator;
        //分页查询条件
        int pageNo=1;//初始查询页数
        int needPageNo=1;//需要查询页数
        int pageSize=100;//默认查询笔数
        //统计数据
        int receiptCountSuccess=0;//入库成功数
        int receiptCount=0;//重复入库数
        int readNo=0;//已查询数
        int totalNumber=0;//总数
        //分页查询
        while (pageNo<=needPageNo){
            //1、电子回单列表查询
            XIB01Header xib01Header=new XIB01Header();
            xib01Header.txnCode = "IESI109049";
            xib01Header.extRefId=getQryTransID();
            JSONObject jsonBody=new JSONObject();
            jsonBody.put("accountNo",pReqReceipt.actNum);//账号
            jsonBody.put("startDate",queryDate);//开始日期
            jsonBody.put("endDate",queryDate);//截止日期
            jsonBody.put("pageNo",pageNo);//页号
            jsonBody.put("pageSize",pageSize);//每页记录条数
            jsonBody.put("subAcctNo",null);//子账号
            String reqContent=writeCommonHead(jsonBody,xib01Header);
            //发起请求
            String[] tmpStrRet=sendToBank(Signatures(reqContent));
            //接收银行请求，开始处理
            if(tmpStrRet[0].length()==0){
                JSONObject jsonRsp=JSONObject.parseObject(tmpStrRet[1]);
                String retCode = jsonRsp.getString("respCode");
                String respMsg = jsonRsp.getString("respMsg");
                if("00000".equals(retCode)){
                    JSONObject jsonRspBody=jsonRsp.getJSONObject("body");
                    //查询返回总笔数
                    String totalNo=jsonRspBody.getString("totalNumber");
                    if(StringHelper.hasAnyChar(totalNo)){
                        totalNumber=Integer.parseInt(totalNo);
                        if(totalNumber>0){
                            //计算需要查询的页数
                            needPageNo=totalNumber/pageSize;
                            if(totalNumber%pageSize>0){
                                needPageNo+=1;
                            }
                            //获取回单列表
                            JSONArray tradeDataList=jsonRspBody.getJSONArray("tradeDataList");
                            for(int i=0;i<tradeDataList.size();i++){
                                readNo++;
                                JSONObject tradeData=tradeDataList.getJSONObject(i);
                                //影像批次号
                                String ecmBatchNo=tradeData.getString("ecmBatchNo");
                                //唯一识别码
                                String uniqueCode=tradeData.getString("uniqueCode");
                                //文件名
                                String fileName=tradeData.getString("fileName");
                                fileName=fileName.replace(".OUT",".pdf");
                                //2、电子回单文件下载地址查询
                                XIB01Header xib01DownloadHeader=new XIB01Header();
                                xib01DownloadHeader.txnCode = "IESI109050";
                                xib01DownloadHeader.extRefId=getQryTransID();
                                JSONObject jsonDownloadBody=new JSONObject();
                                jsonDownloadBody.put("ecmBatchNo",ecmBatchNo);
                                jsonDownloadBody.put("uniqueCode",uniqueCode);
                                String reqDownloadContext=writeCommonHead(jsonDownloadBody,xib01DownloadHeader);
                                //发起请求
                                String[] tmpStrDownload=sendToBank(Signatures(reqDownloadContext));
                                //接收银行请求，开始处理
                                if(tmpStrDownload[0].length()==0){
                                    JSONObject jsonDownloadRsp=JSONObject.parseObject(tmpStrDownload[1]);
                                    String rspCode = jsonDownloadRsp.getString("respCode");
                                    String rspMsg = jsonDownloadRsp.getString("respMsg");
                                    if("00000".equals(rspCode)){
                                        //3、电子回单文件下载
                                        JSONObject jsonDowlRspBody=jsonDownloadRsp.getJSONObject("body");
                                        String fileUrl=jsonDowlRspBody.getString("fileUrl");
                                        String localFilePath=receiptDownloadPath+fileName;
                                        boolean isDownloadFlag=sendToBankDownload(fileUrl,localFilePath);
                                        if(isDownloadFlag){
                                            ReceiptDataHelper receiptHelper=null;
                                            try{
                                                //4、填充电子回单信息
                                                ReceiptData eachData = new ReceiptData();
                                                /**回单唯一标识（在银行端的唯一标识（该账号的唯一），如招行的打印实例号）*/
                                                eachData.istNbr=uniqueCode;
                                                /**回单关联号（回单编号）*/
                                                eachData.receiptNo=tradeData.getString("txnReference");
                                                /**业务参考号*/
                                                eachData.busRef=tradeData.getString("txnReference");
                                                /**银行流水号*/
                                                eachData.bnkSeqNo=tradeData.getString("txnReference");
                                                /**银行代码，厦门国际银行*/
                                                eachData.bank="781";
                                                /**线路代码（来源渠道），如工行直联ICBC02*/
                                                eachData.srcSys=this.bankFront.bankCode;
                                                /**本方账号*/
                                                eachData.ownAct=tradeData.getString("accountNo");
                                                /**对方账号*/
                                                eachData.oppActNum=StringHelper.hasAnyChar(tradeData.getString("payeeAccount"))
                                                        ?tradeData.getString("payeeAccount"):tradeData.getString("payerAcc");
                                                /**对方户名*/
                                                eachData.oppActName=StringHelper.hasAnyChar(tradeData.getString("payeeName"))
                                                        ?tradeData.getString("payeeName"):tradeData.getString("payerName");
                                                /**交易方向*/
                                                eachData.moneyWay="";
                                                /**币种*/
                                                eachData.cur=getBankConfig().getMapKeyByValue("curActMapping", tradeData.getString("accountNo"));
                                                /**金额*/
                                                eachData.amount=tradeData.getBigDecimal("amount");
                                                /**凭证号码*/
                                                eachData.voucherNo=tradeData.getString("voucherID");
                                                /**日期*/
                                                eachData.busDate=Integer.parseInt(queryDate);
                                                /**回单文件--本地文件相对路径*/
                                                eachData.localFile=StringHelper.getRelativePath(localFilePath, pConfig.localSaveMainDir);
                                                /**源文件路径*/
                                                eachData.srcFile=localFilePath;
                                                /**回单文件类型*/
                                                eachData.fileType="1";
                                                /**下载状态：指从银行下载该回单文件的状态，1未下载；2已下载；3下载失败；4下载中*/
                                                eachData.downState="2";
                                                /**下载时间*/
                                                eachData.downTime=new Date();
                                                /**下载信息，如果失败则为失败原因*/
                                                eachData.downInfo="下载成功";
                                                /**上传状态：指文件从银行端下载完成后，上传至ftp或ats或oss或客制化文件服务的状态，1未上传；2已上传；3上传失败；4上传中*/
                                                eachData.upState="1";
                                                /**推送状态：指文件上传完成后，回单数据推送至ats或客制化平台的状态，1未推送；2已推送；3推送失败；4推送中*/
                                                eachData.pushState="1";
                                                /**创建时间*/
                                                eachData.createdOn=new Date();
                                                /**最后修改时间*/
                                                eachData.lastModifiedOn=new Date();
                                                /**版本号*/
                                                eachData.rowVersion=1;
                                                receiptHelper = new ReceiptDataHelper(reqHeader.tenant, eachData.getBusDate());
                                                //回单数据记录入库
                                                int inRe = receiptHelper.insertIfNotExist(eachData,true);
                                                if(inRe>0){
                                                    receiptCountSuccess++;
                                                    WriteBankLogLn("文件"+fileName+"入库成功");
                                                }else if(inRe==0){
                                                    receiptCount++;
                                                    WriteBankLogLn("文件"+fileName+"重复入库");
                                                }else{
                                                    WriteBankLogLn("数据入库异常："+eachData.receiptNo+"\n");
                                                }
                                            }catch (Exception e){
                                                WriteBankLogLn(tradeData.getString("txnReference")+"回单下载失败，"+e);
                                            }finally {
                                                if(receiptHelper != null){
                                                    receiptHelper.close();
                                                }
                                            }
                                        }else {
                                            WriteBankLogLn(tradeData.getString("txnReference")+"回单下载失败，请重新查询下载");
                                        }
                                    }else {
                                        WriteBankLogLn(tradeData.getString("txnReference")+"回单下载异常："+rspMsg);
                                    }
                                }else {
                                    WriteBankLogLn(tradeData.getString("txnReference")+"回单下载异常："+tmpStrDownload[1]);
                                }
                            }
                        }else {
                            WriteBankLogLn("totalNo返回为"+totalNo);
                        }
                    }else {
                        WriteBankLogLn("totalNo返回为"+totalNo);
                    }
                }else {
                    WriteBankLogLn("回单异常："+respMsg);
                }
            }else {
                WriteBankLogLn("回单异常："+tmpStrRet[1]);
            }
            pageNo++;
        }
        WriteBankLogLn("银行返回总数："+totalNumber+"条；查询总数："+readNo+"条；已成功入库"+receiptCountSuccess+"条；重复数据"+receiptCount+"条");
        WriteBankLogLn("查询"+queryDate+"的回单结束");
        return null;
    }
}
